[小ネタ]dbtで実行順序が巡回するように開発すると何が起こるか #dbt
さがらです。
小ネタなのですが、dbtで実行順序が巡回するように(つまりDAGとならないように)開発すると何が起こるか確かめてみました。
DAGとは
DAGとは「Directed Acyclic Graph」の略で、日本語に直すと「有向非巡回グラフ」となります。
以下、Wikipediaからの引用となります。Airflowなどで構築したワークフローは基本的にDAGになりますし、実際にDAGという用語が使われていますよね。
有向非巡回グラフ、有向非循環グラフ、有向無閉路グラフ(ゆうこうひじゅんかいグラフ、英: Directed acyclic graph, DAG)とは、グラフ理論における閉路のない有向グラフのことである。有向グラフは頂点と有向辺(方向を示す矢印付きの辺)からなり、辺は頂点同士をつなぐが、ある頂点vから出発し、辺をたどり、頂点vに戻ってこないのが有向非巡回グラフである
DAGや有向非巡回グラフと聞くと難しいですけども、データ基盤においては「順序付けする必要があるタスクの集合を図示したもの」という意味合いで使われることが多いと思います。
とても簡単な例ですが、
- 「A➟B➟C」という実行順序:DAG
- 「A➟B➟C➟Aにまた戻る」という巡回する実行順序:DAGでない
というイメージですね。
実行順序が巡回するようにdbtで開発するとどうなるか
DAG自体の説明は前述のとおりですが、実行順序が巡回するようにdbtで開発するとどうなるのか、確かめてみます。
前準備
とても簡単なmodelを3つ、定義しておきます。リネージとしては下図のようにしておきます。
この時、aaaがcccを参照するとどうなるのかを確かめてみます。
結論
ということで早速結論に入るのですが、Lineage
がエラーとなりました!
「Found a cycle」ということで、「DAGじゃないよ~巡回しているよ~」と言われちゃってますね。
加えて、この状態でdbt run
をしてみると、当たり前ですがエラーとなりました。エラーの内容は同じですね。
ということで、「実行順序が巡回するようにdbtで開発をすると、ちゃんとエラーを返してくれる」ことがわかりました。